// 设备id：只能输入英文、数字、下划线和减号位
// const numberAnd_Pattern = /^[0-9a-zA-Z_-]{1,}$/;

// 匹配通用名称，中英文都可，不含特殊字符即可，可以输入 @ () * - _
const commonName = new RegExp(
  "[`~!$%^&*|{}':;',《》\\[\\].<>/?~！￥%……&*——+|{}【】‘；：”“’。，、？]"
);

// 匹配中英文，适用于全企业名称和企业别名等
const chineseAndEngilsh = /^[\u4e00-\u9fa5_a-zA-Z]+$/;

export const testLanguage = val => chineseAndEngilsh.test(val);

const regOftelephone = /(?:^1[3456789]|^9[28])\d{9}$/;

// 匹配地址，中文、字母、数字、下划线、中划线
const regOfaddress = /^[A-Za-z0-9-_\u4e00-\u9fa5]{1,30}$/;

// 用户名正则，2到16位（字母，数字，下划线，减号）
const userNamePattern = /^[a-zA-Z0-9_-]{2,16}$/;

// 密码，只能输入字母、数字、英文特殊字符
// const passWordPattern = /^(?![a-zA-z]+$)(?!\d+$)(?![!@#$%^&*]+$)[a-zA-Z\d!@#$%^&*]+$/;
const passWordPattern = /^[a-zA-Z0-9_-]{2,16}$/;

// 有效邮箱地址
const eMailPattern = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;

// 正整数 + 0
const intPattern = /^[0-9]+$/;

// 正整数 + 0
export const validateDeviceId = (k, mes) => {
  return (rule, value, callback) => {
    if (!value && value != 0) {
      callback(new Error(`请输入${k}!`));
    } else {
      // 匹配到规则返回true
      if (!intPattern.test(value)) {
        callback(new Error(mes));
      } else {
        callback();
      }
    }
  };
};

// 正整数
const intPattern0 = /^[0-9]*[1-9][0-9]*$/;
// 正整数
export const validateDeviceId1 = (k, mes) => {
  return (rule, value, callback) => {
    if (!value && value != 0) {
      callback(new Error(`请输入${k}!`));
    } else {
      // 匹配到规则返回true
      if (!intPattern0.test(value)) {
        callback(new Error(mes));
      } else {
        callback();
      }
    }
  };
};

// 校验非必填的正整数
export const validateNoRequiredInt = (key, message) => {
  return (rule, value, callback) => {
    if (value === 0 || !value) {
      callback();
    } else {
      // 匹配到规则返回true
      if (!intPattern0.test(value)) {
        callback(new Error(message));
      } else {
        callback();
      }
    }
  };
};

export const validateDeviceName = (k, mes) => {
  return (rule, value, callback) => {
    if (!value) {
      callback(new Error(`请输入${k}!`));
    } else {
      // 匹配到规则返回true
      if (commonName.test(value)) {
        callback(new Error(mes));
      } else {
        callback();
      }
    }
  };
};

// 城市名称等 只能输入中英文
export const validateCityName = (k, mes) => {
  return (rule, value, callback) => {
    if (!value) {
      callback(new Error(`请输入${k}!`));
    } else {
      if (!chineseAndEngilsh.test(value)) {
        callback(new Error(mes));
      } else {
        callback();
      }
    }
  };
};

// 匹配地址 只能输入中文、字母、数字、下划线和中划线
export const validateAddress = (k, mes) => {
  return (rule, value, callback) => {
    if (!value) {
      callback(new Error(`请输入${k}!`));
    } else {
      if (value.length > 30) {
        callback(new Error(`${k}长度不能超过30个字符`));
      } else {
        if (!regOfaddress.test(value)) {
          callback(new Error(mes));
        } else {
          callback();
        }
      }
    }
  };
};

// 匹配电话号码
export const validateTelephone = (k, mes) => {
  return (rule, value, callback) => {
    if (!value) {
      callback(new Error(`请输入${k}!`));
    } else {
      if (!regOftelephone.test(value)) {
        callback(new Error(mes));
      } else {
        callback();
      }
    }
  };
};

export const validateUserName = (k, mes) => {
  return (rule, value, callback) => {
    if (!value) {
      callback(new Error(`请输入${k}!`));
    } else {
      if (!userNamePattern.test(value)) {
        callback(new Error(mes));
      } else {
        callback();
      }
    }
  };
};

export const validatePwd = (k, mes) => {
  return (rule, value, callback) => {
    if (!value) {
      callback(new Error(`请输入${k}!`));
    } else {
      if (!passWordPattern.test(value)) {
        callback(new Error(mes));
      } else {
        callback();
      }
    }
  };
};

export const validatePwd1 = mes => {
  return (rule, value, callback) => {
    if (!passWordPattern.test(value)) {
      callback(new Error(mes));
    } else {
      callback();
    }
  };
};

export const validateEmail = (k, mes) => {
  return (rule, value, callback) => {
    if (!value) {
      callback(new Error(`请输入${k}!`));
    } else {
      if (!eMailPattern.test(value)) {
        callback(new Error(mes));
      } else {
        callback();
      }
    }
  };
};

const nengXiaoPattern = /\d+:\d+-\d+:\d+/;
const moreThanZero = num => (Number(num) > 0 ? true : false);

// nengXiaoPattern.test('9:00-19:00')
export const validateNengXiaoYuZhi = (k, mes) => {
  return (rule, value, callback) => {
    if (!value) {
      callback(new Error(`请输入${k}！`));
    } else {
      if (moreThanZero(value) || nengXiaoPattern.test(value)) {
        callback();
      } else {
        callback(new Error(mes));
      }
    }
  };
};

const TitlePattern = new RegExp("[`~@#$%^&*+=|{}\\[\\].<>/?~！@#￥%&*{}]");

export const validateTitle = k => {
  return (rule, value, callback) => {
    if (!value) {
      callback(new Error(`请输入${k}`));
    } else {
      if (TitlePattern.test(value)) {
        callback(new Error(`${k}不能含有特殊字符！`));
      } else {
        callback();
      }
    }
  };
};

// 输入多个电话号码，使用逗号分隔
const checkPhone1 = new RegExp("^1[345789][0-9]{9}(,1[345789][0-9]{9})*$");
export const validateTelphone1 = (rule, value, callback) => {
  if (!value) {
    callback(new Error("电话不能为空"));
  } else {
    if (!checkPhone1.test(value)) {
      callback(
        new Error("电话号码输入不合法，电话号码可以输入多个，使用英文逗号分隔")
      );
    } else {
      callback();
    }
  }
};

function isValidIP(ip) {
  var reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/;
  return reg.test(ip);
}

export const validateIP = (k, mes) => {
  return (_, value, callback) => {
    if (!isValidIP(value)) {
      if (value == "") {
        callback();
      } else {
        callback(new Error(mes));
      }
    } else {
      if (value === "0.0.0.0") {
        callback(new Error("通道IP格式错误"));
      } else {
        callback();
      }
    }
  };
};

// export function checkNumber(e) {
//   let ev = e || event;
//   // return (/[\d]/.test(String.fromCharCode(ev.keyCode || ev.which))) || ev.which === 8
//   return /[\d]/.test(String.fromCharCode(event.keyCode));
// }

const floatInteger = /^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$/;

export const validateFloatInteger = (key, mes) => {
  return (rule, value, callback) => {
    if (!value) {
      callback(new Error(`请输入${key}`));
    } else {
      if (!floatInteger.test(value)) {
        callback(new Error(mes));
      } else {
        callback();
      }
    }
  };
};
